package com.cw.demo.utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import com.cw.demo.model.DbConfig;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 操作数据库的工具类
 *  使用单例模式来创建
 */
public class DbUtils {

    private static DbUtils instance = null;

    public static DbUtils getInstance(){
        if(instance == null){
            instance = new DbUtils();
        }
        return instance;
    }

    private DruidDataSource dataSource = null;
    private DbUtils(){
        try {
            DbXmlReadUtil dbXmlReadUtil = new DbXmlReadUtil();
            DbConfig dbConfig = dbXmlReadUtil.readDbXml();
            // 1)创建连接池：druid
            dataSource = new DruidDataSource();
            // 2)指定连接池连接数据库所需的参数
            //1、设置连接数据库的驱动
            dataSource.setDriverClassName(dbConfig.getDriverName());
            //2、设置连接数据库的URL
            dataSource.setUrl(dbConfig.getUrl());
            //3、数据库的连接帐号和连接密码
            dataSource.setUsername(dbConfig.getUserName());
            dataSource.setPassword(dbConfig.getPassword());


            //4、 可以对druid连接池进行一些相关参数配置
            dataSource.setInitialSize(dbConfig.getInitialSize());//设置连接池在创建成功时，默认的连接数量
            dataSource.setMinIdle(dbConfig.getMinIdle()); //设置最小连接池数量。确保连接池中至少存在参数中设置的连接个数为空闲状态
            dataSource.setMaxActive(dbConfig.getMaxActive());//设置最大连接池数量。连接池中超过大最数量时，超出的连接对象将会被销毁
            dataSource.setMaxWait(dbConfig.getMaxWait());//设置最大等待时长
            dataSource.setTimeBetweenEvictionRunsMillis(dbConfig.getTimeBetweenEvictionRunsMillis());//设置程序自动检测连接状态的时间间隔

        } catch (Exception e) {
            e.printStackTrace();
        }




    }

    /**
     * 创建一个统一获取连接的方法
     * @return
     */
    public Connection getConnection(){
        DruidPooledConnection connection = null;
        try {
            connection = dataSource.getConnection();
            return connection;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }
    //凡是被static或final修辞的变量或方法或类，会直接实例化并存储内存中，且直接到工程结束运行，才会被回收。
    // 无论何时去调用，这个变量或对象 永远只会创建一次。任何地方调用，将调用的都是同一个变量或同一个对象
    private static Connection connection = null;
    //编写一个测试方法，测试当前工具类是否正确
    public static void main(String[] args) {
        connection = DbUtils.getInstance().getConnection();
        if(connection != null){
            try {
                ResultSet resultSet = connection.createStatement().executeQuery("select * from salarygrade");
                while (resultSet.next()){
                    System.out.println(resultSet.getInt(1));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }


}
